package com.app.serial.jsso;

import com.app.framework.manager.AsyncManager;
import com.app.stick.factory.MonitorFactory;
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
import lombok.extern.slf4j.Slf4j;

/**
 * @author user
 * @date 2023年08月26日
 * @describe 设备串口事件监听器
 */
@Slf4j
public class SerialPortListener implements SerialPortEventListener {

    SerialPort serialPort;

    public SerialPortListener(SerialPort serialPort) {
        this.serialPort = serialPort;
    }


    /**
     * 消息监听
     * A5 03 09 E5 0B 8A E7 4A 1D F7 ED 4F AA
     * A5 03 09 E5 0B 8A E7 4A 1D F7 ED 4F E5 0B 8A E7 4A 1D F7 ED 4F
     * A5   针头
     * 03 	0XFF：传感器没接/断开 0X00：传感器短路 0X01：温度<25° 0X02：温度>45° 0X03: 环境温度<5° 0x04: 环境温度>40°
     * 09 数据位
     * 3E 0D 温度
     * 23 E5 FF A2 79 53
     * 30  电量
     * AA  结束位
     * @param event
     */
    @Override
    public synchronized void serialEvent(SerialPortEvent event) {
        if (event.isCTS()) {
            log.debug("CTS");
        } else if (event.isDSR()) {
            log.debug("DSR");
        } else if (event.isRXCHAR()) {
            //针头
            String bf1 = "A5";
            //结束位
            String bfLast = "AA";
            while (event.getEventValue() >= 3) {
                try {
                    String string = "";
                    //第一个帧头
                    String hexHead = serialPort.readHexString(1);
                    if (!bf1.equals(hexHead)) {
                        continue;
                    }
                    string = string + hexHead;

                    //第二位数据类型
                    String hexType = serialPort.readHexString(1);
                    string = string + hexType;

                    //第三位是数据长度
                    String hexLength = serialPort.readHexString(1);
                    string = string + hexLength;
                    int length = Integer.valueOf(hexLength);

                    //判断剩余长度是否够
                    while (event.getEventValue() < (length + 1)) {
                        Thread.sleep(1);
                    }

                    //数据位
                    String hexValue = serialPort.readHexString(length);
                    string = string + hexValue;

                    //结束位
                    String hexEnd = serialPort.readHexString(1);
                    if (bfLast.equals(hexEnd)) {
                        string = string + hexEnd;
                        String command = string.replace(" ", "");
                        log.info("接收到的指令信息是:{}", command);
                        AsyncManager.me().nowExecute(MonitorFactory.monitor(string.replace(" ", "")));
                    }
                } catch (SerialPortException e) {
                    log.error("串口数据读取失败：" + e);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }

    }

}
